# coding=utf-8
from common.utils.types import Enum
from common.lottery import LOTTERY_TYPE
from common import orm

LF_LOTTERY_TYPES = (
    LOTTERY_TYPE.CQ_LF,
)

LF_BET_CATEGORY = Enum({
    'CHOSEN_ONE': (1L, u'首位玩法'),
    'TWO': (2L, u'二连玩法'),
    'THREE_FRONT': (3L, u'前三玩法'),
    'LUCKY': (4L, u'幸运玩法'),
})

# 三位数表示，第一位表示猜几位，第二位表示0(全投) 1(數投), 2(紅投) 3(前) 4(中) 5(後), (9)特殊玩法
# 第三位0(首位直选)， 1(連直選), 2(组选)  7(幸運) 9(特殊玩法)
BET_TYPE = Enum({
    "CHOSEN_ONE": (110L, u"首位数投"),
    "CHOSEN_RED_ONE": (120L, u"首位红投"),

    "TWO_DIRECT": (201, u"二连直"),
    "TWO_GROUP": (202L, u"二连组"),

    "THREE_FRONT_DIRECT": (331L, u'前三直'),
    "THREE_FRONT_GROUP": (332L, u'前三组'),

    "LUCKY_TWO": (207L, u'幸运二'),
    "LUCKY_THREE": (307L, u"幸运三"),
    "LUCKY_FOUR": (407L, u"幸运四"),
    "LUCKY_FIVE": (507L, u"幸运五")
})

LF_BET_CATEGORY_TYPE = [
    (LF_BET_CATEGORY.CHOSEN_ONE, [BET_TYPE.CHOSEN_ONE, BET_TYPE.CHOSEN_RED_ONE]),
    (LF_BET_CATEGORY.TWO, [BET_TYPE.TWO_DIRECT, BET_TYPE.TWO_GROUP]),
    (LF_BET_CATEGORY.THREE_FRONT, [BET_TYPE.THREE_FRONT_DIRECT, BET_TYPE.THREE_FRONT_GROUP]),
    (LF_BET_CATEGORY.LUCKY, [BET_TYPE.LUCKY_TWO, BET_TYPE.LUCKY_THREE,
                             BET_TYPE.LUCKY_FOUR, BET_TYPE.LUCKY_FIVE]),
]

BET_TYPE_DESC = {
    BET_TYPE.CHOSEN_ONE: u"从01至18中任选1个,投注号码与开奖号码第一位相同即中奖",
    BET_TYPE.CHOSEN_RED_ONE: u"19，20为红号，从这两个号码任选一个投注，开奖号码第一位是红号（19或20）即中奖",
    BET_TYPE.TWO_DIRECT: u"从20个号码中任选连续两位,投注号码与开奖号码任意连续两位数字、顺序均相同即中奖",
    BET_TYPE.TWO_GROUP: u"从20个号码中任选2个,投注号与开奖号任意连续两位数字相同(顺序不限)即中奖",
    BET_TYPE.THREE_FRONT_DIRECT: u"从20个号码中猜开奖号码前三位,投注号码与开奖号码前三位数字、顺序均相同即中奖",
    BET_TYPE.THREE_FRONT_GROUP: u"从20个号码中猜开奖号码的前三位,投注号与开奖号前三位数字相同(顺序不限)即中奖",
    BET_TYPE.LUCKY_TWO: u"从20个号码中任选2个,投注号码与开奖号码任意两位相同即中奖",
    BET_TYPE.LUCKY_THREE: u"从20个号码中任选3个,投注号码与开奖号码任意三位相同即中奖",
    BET_TYPE.LUCKY_FOUR: u"从20个号码中任选4个,投注号码与开奖号码任意四位相同即中奖",
    BET_TYPE.LUCKY_FIVE: u"从20个号码中任选5个,投注号码与开奖号码任意五位相同即中奖"
}


def get_avaliable_bet_types():
    _list = []
    for category, bet_types in LF_BET_CATEGORY_TYPE:
        type_list = []
        _id = 1
        for bet_type in bet_types:
            type_list.append({
                'id': _id,
                'title': BET_TYPE.get_label(bet_type),
                'play_id': bet_type,
                'des': BET_TYPE_DESC[bet_type],
                'rule': '',
                'support': 1
            })
            _id += 1
        data = {
            'id': category,
            'title': LF_BET_CATEGORY.get_label(category),
            'support': 1,
            'list': type_list
        }
        _list.append(data)
    return _list


class LFActivity(object):
    id = orm.Column(orm.Integer, primary_key=True)
    term = orm.Column(orm.VARCHAR)  # 期号
    number = orm.Column(orm.VARCHAR)  # 开奖结果
    reference = orm.Column(orm.TEXT)  # 爬取结果页url
    status = orm.Column(orm.SmallInteger)  # 状态
    start_ts = orm.Column(orm.Integer)  # 我方开始时间戳（整点）
    end_ts = orm.Column(orm.Integer)  # 我方结束时间戳（略早于官方）
    announce_ts = orm.Column(orm.Integer)  # 爬取到结果的时间戳
    created_at = orm.Column(orm.DATETIME)
    updated_at = orm.Column(orm.DATETIME)


class LFTrend(object):
    ''' 五星基本走势，每位（个十百千万）各占一个字段，类型是字符串，
            格式是用逗号分隔的遗漏次数。如果当期出现，遗漏次数为0. 由于
            这玩意儿理论上可以无限前溯，所以最开始的几期里面会出现`x`，表示
            遗漏次数未知。后续其他走势图的部分数据可以直接从这里拿。统计数据不做存储，
            考虑使用redis进行cache，或者让客户端自己算。

            NOTE: 由于爬虫的结果是乱序的，不能保证开奖的顺序是递增的。这里在插入数据的时候，
            要考虑到这个问题。
    '''
    id = orm.Column(orm.Integer, primary_key=True)
    term = orm.Column(orm.VARCHAR)
    number = orm.Column(orm.VARCHAR)
    # 每一位遺漏的次數
    idx_0 = orm.Column(orm.VARCHAR)  # ㄧ位
    idx_1 = orm.Column(orm.VARCHAR)  # 二位
    idx_2 = orm.Column(orm.VARCHAR)  # 三位
    idx_3 = orm.Column(orm.VARCHAR)  # 四位
    idx_4 = orm.Column(orm.VARCHAR)  # 五位
    idx_5 = orm.Column(orm.VARCHAR)  # 六位
    idx_6 = orm.Column(orm.VARCHAR)  # 七位
    idx_7 = orm.Column(orm.VARCHAR)  # 八位

    @classmethod
    def get_defaults(cls):
        data = {}
        for k in range(8):
            data['idx_%s' % k] = ','.join('x' * 20)

        return data

    def get_stat(self, bet_type):
        ''' 根据玩法返回统计（遗漏、最大）数据
            这个数据应该被缓存起来（因为冷热和最大需要实时计算）
            对于每一期而言，这个数据是固定的
        '''
        resp = {}
        return resp
